package org.wzh.spring.aop.demo2;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @Pointcut 注解设置的值是一个切点表达式,就像之前在通知注解上所设置的那样.
 * 通过在performance()方法上添加@Pointcut注解,我们实际上扩展了切点表达式的语言,这样就可以在任何的切点表达式中使用performance()了,
 * 如果不这样做的话,你需要在这些地方使用哪个更长的切点表达式.
 * performance()方法的实际内容并不重要,在这里它实际上应该是空的.其实该方法本身只是一个标识,供@Pointcut注解依附.
 * 需要注意的是,除了注解和没有实际操作的performance()方法,Audience类依然是一个POJO.我们能够像使用其他的Java类那样调用它的方法,它的
 * 方法也能够独立的进行单元测试,这与其他的Java类并没有什么区别.Audience只是一个Java类,只不过它通过注解表明会作为切面使用而已.
 * 与其他的Java类一样,它可以装配为Spring中的bean.
 * @author Pear
 *
 */
@Aspect
public class AudiencePlus {
	
	/**
	 * 定义命名的切点
	 */
	@Pointcut("execution(** org.wzh.spring.aop.demo2.Performance.perform(..))")
	public void performance() {}
	
	//表演之前
	@Before("performance()")
	public void silenceCellPhones() {
		System.out.println("Silencing cell phones --  AudiencePlus");
	}
	
	//表演之前
	@Before("performance()")
	public void takeSeats() {
		System.out.println("Taking seats --  AudiencePlus");
	}
	
	//表演之后
	@AfterReturning("performance()")
	public void applause() {
		System.out.println("CLAP CLAP CLAP!!! --  AudiencePlus");
	}
	
	//表演失败之后
	@AfterThrowing("performance()")
	public void demandRefund() {
		System.out.println("Demanding a refund --  AudiencePlus");
	}

}
